package com.itcam.cli;

import com.itcam.cli.command.ConfigCommand;
import com.itcam.cli.command.GenerateCommand;
import com.itcam.cli.command.ListCommand;
import picocli.CommandLine;
import picocli.CommandLine.Command;

/**
 * @author : Cammy.Wu
 * Description : 负责绑定所有子命令，并且提供执行命令的方法
 */

/**
 * 📌 此注解用于定义命令行工具的主命令，名为 "cammy"，并启用标准的帮助选项。
 * 当用户输入 --help 时，会显示帮助信息。
 */
@Command(name = "cammy", mixinStandardHelpOptions = true)
/**
 * 🌟 CommandExecutor 类实现了 Runnable 接口，负责绑定所有子命令，并提供执行命令的方法。
 */
public class CommandExecutor implements Runnable {

    /**
     * 🛠 用于处理命令行参数和执行命令的 CommandLine 对象。
     */
    private final CommandLine commandLine;

    /**
     * 🔧 初始化块，在对象创建时执行。
     * 这里将 GenerateCommand、ConfigCommand 和 ListCommand 作为子命令添加到主命令中。
     */ {
        commandLine = new CommandLine(this)
                // 添加 GenerateCommand 作为子命令
                .addSubcommand(new GenerateCommand())
                // 添加 ConfigCommand 作为子命令
                .addSubcommand(new ConfigCommand())
                // 添加 ListCommand 作为子命令
                .addSubcommand(new ListCommand());
    }

    /**
     * 🚀 实现 Runnable 接口的 run 方法。
     * 当用户不输入子命令时，给出友好提示，告知用户输入具体命令或 --help 查看提示。
     */
    @Override
    public void run() {
        // 不输入子命令时，给出友好提示
        System.out.println("请输入具体命令，或者输入 --help 查看命令提示");
    }

    /**
     * 💻 执行命令的方法。
     *
     * @param args 从命令行接收到的参数数组。
     * @return 命令执行的退出码，用于指示命令执行的结果。
     */
    public Integer doExecute(String[] args) {
        return commandLine.execute(args);
    }
}

